package com.project.myPackage.common;

/**
 * 基于ThreadLocal封装工具类，用户保存和获取当前登录用户id
 *
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    /**
     * 设置值
     * @param id
     */
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }

    /**
     * 获取值
     * @return
     */
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

/**
 * 填充用户id需了解知识
 * 1.Long id=Thread.currentThread().getId();//获取当前线程id发现
 * LoginChechFilter中doFilter
 * EmployeeController中update
 * MetaObjectHandler中updateFill方法属于同一个线程
 *
 * ThreadLocal不是Thread，而是Tread的局部变量，每个线程都有自己的局部变量，线程之间互不影响，ThreadLocal为每个线程提供单独一份存储空间，可以解决多线程并发访问的问题。
 *
 * ThreadLocal常用方法
 * public void set(T value);
 * public T get();
 * 实现步骤
 * 1.编写BaseContext工具类，基于LocalThread实现
 * 2.在登录拦截器中设置当前线程的ID，在修改时也设置当前线程的ID
 * 3.在修改时，把当前线程的ID设置到数据库中
 */